package com.sz.biz.logistics.ord.service;

import com.sz.biz.logistics.ord.dto.OrdOrderFeeDto;
import com.sz.biz.logistics.ord.dto.OrdOrderOptionService;
import com.sz.biz.logistics.ord.entity.OrdOrderFee;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * Function:订单费用service <br>
 * Author: hpeng.wang <br>
 * Date: 2017-11-21 20:20:00
 */

public interface OrdOrderFeeService {
    /**
     * 新增
     *
     * @param entry 新增的实体
     * @return 新增是否成功
     */
    void save(OrdOrderFee entry);

    void batchSave(List<OrdOrderFee> ordOrderFeeList);

    void deleteByOrderNo(String orderNo);

    /**
     * 批量修改实体
     *
     * @param list
     */
    int batchUpdate(List<OrdOrderFee> list);

    /**
     * 更新实体
     *
     * @param entry 更新的实体
     * @return 新增是否成功
     */
    int update(OrdOrderFee entry);

    /**
     * 根据订单号、费用、费用单位，创建或更新订单费用信息(ord_order_fee)
     *
     * @param orderNo      订单号
     * @param fee          费用
     * @param currencyCode 费用的单位
     */
    void saveOrUpdate(String orderNo, BigDecimal fee, String currencyCode);


    /**
     * 根据主键Id查询单个实体
     *
     * @param id 主键id
     * @return 查询出来的实体对象
     */
    OrdOrderFee findById(Integer id);

    /**
     * 根据id集合查询实体
     *
     * @param ids
     * @return
     */
    List<OrdOrderFee> findByIds(List<Integer> ids);


    OrdOrderFee findByOrderNo(String orderNo);


    /**
     * 根据订单编号查询对应的订单费用列表
     *
     * @param orderNoList 订单编号列表
     * @return 订单费用列表
     */
    List<OrdOrderFee> findByOrderNos(List<String> orderNoList);

    /**
     * 根据orderNoList获取订单费用的dto集合
     *
     * @param orderNo
     * @return
     */
    OrdOrderFeeDto findDtoByOrderNo(String orderNo);

    /**
     * 根据订单号集合，批量获取订单费用
     *
     * @param orderNos
     * @return
     */
    Map<String, OrdOrderFeeDto> findMapDtosByOrderNos(List<String> orderNos);

    /**
     * 根据订单号重新分派服务与计算预估费用。
     *
     * @param orderNo 订单号
     */
    void submitBillByAccept(String orderNo);
    void saveChannelNo(String orderNo, List<OrdOrderOptionService> optionServices);
    /**
     *
     * @param orderNo
     */
    void submitBillByReceGood(String orderNo);

    boolean submitBillByTransport(String orderNo);

    /**
     * 当订单处于运输中之后的状态，对订单的修改也要触发物多服务分派、计费
     * @param orderNo 订单号
     * @return
     */
    boolean submitBillByTransportAfter(String orderNo);

    boolean submitBill(String orderNo);

    /**
     * 订单的多服务分派
     *
     * @param orderNo
     */
    boolean orderServiceAssign(String orderNo);

    Map<String, List<String>> findMapByOrderNos(List<String> orderNoList);

}
